﻿using System;
using System.IO;
using System.Data.SqlClient;

public partial class SiteMaster : System.Web.UI.MasterPage
{
    private Boolean _FolioExists;
    private Int32 _Folio;

    protected void Page_Load(object sender, EventArgs e)
    {

        String SessionID = (String)Session["SessionID"];
        String SessionName = (String)Session["SessionName"];

        // TRUE: Muestra contenido para usuario autenticado
        if (!String.IsNullOrEmpty(SessionID))
        {
            LoginStatusLabel.Text = "Bienvenido(a) " + SessionName;
            LoginContent.Visible = false;
            LoginStatusContent.Visible = true;
            DefaultMenu.Visible = false;
            LoginValidationSummary.Visible = true;

            String SessionUserType = (String)Session["UserType"];

            if (SessionUserType.Equals("Alumnos"))
            {

                DatabaseConnection dbCon = new DatabaseConnection();
                _FolioExists = dbCon.FolioExistsForCurrentUser(ref _Folio, SessionID);
                Boolean enviada = dbCon.IsSolicitudEnviado(_Folio);
                dbCon.CloseConnection();

                if (enviada)
                {
                    ResumenAlumnoMenu.Visible = false;
                }

                AlumnoMenu.Visible = true;
                // Oculta el FormaMenu de todas las páginas, menos de las Formas
                var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(Request.Path);
                if (fileNameWithoutExtension != null && (fileNameWithoutExtension.StartsWith("Forma")
                                                                               || fileNameWithoutExtension.StartsWith("Resumen")))
                {
                    if (_FolioExists)
                    {
                        FormaMenu.Visible = true;
                        ValidateFolioNoEnviado(enviada);
                    }
                }
            }
            // Es Admin o SuperAdmin
            else if (SessionUserType.Equals("Administradores"))
            {
                AdminMenu.Visible = true;
                if (!String.IsNullOrEmpty((String)Session["SuperAdminActive"]))
                {
                    AdmonCuentasDiv.Visible = true;
                }

            }
            // No debería llegar aquí, pero en dado caso elimina todas las sesiones
            else
            {
                Session.RemoveAll();
                Response.Redirect("~/Default.aspx");
            }

        }
        // Visualización del Guest
        else
        {
            LoginValidationDiv.Visible = true;
            LoginValidationSummary.Visible = true;
            // Oculta el login en la página de CrearCuenta
            var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(Request.Path);
            if (fileNameWithoutExtension != null && fileNameWithoutExtension.Equals("CrearCuenta"))
            {
                LoginContent.Visible = false;
            }
        }
    }


    // Envía la búsqueda la página de resultados.
    protected void Search(object sender, EventArgs e)
    {
        Session.Remove("SearchString");
        Session.Remove("SearchType");
        Session["SearchString"] = SearchStringTextBox.Text;
        Session["SearchType"] = SearchType.SelectedValue;
        Response.Redirect("~/Services/SearchResults.aspx");
    }


    // Si el Folio se ha enviado, se redirecciona cuando se intenta a las formas o resumen
    protected void ValidateFolioNoEnviado(Boolean enviada)
    {
        Uri currentPage = Request.Url;

        if (enviada)
        {
            string[] filesAccess = {
                                       "Forma1.aspx", "Forma2.aspx", "Forma3.aspx", "Forma4.aspx", "Forma5.aspx",
                                       "Forma6.aspx", "Forma7.aspx", "Forma8.aspx", "Forma9.aspx", "Resumen.aspx"
                                   };
            string currentPageFilename = currentPage.Segments[currentPage.Segments.Length-1];
            foreach (string s in filesAccess)
            {
                if (s.Equals(currentPageFilename))
                {
                    Response.Redirect("~/Alumno/");
                }
            }
        }
    }


    // Procesa el Login
    protected void LoginButton_Click(object sender, EventArgs e)
    {
        String UserType;
        String UserID;
        String LoginText = LoginTextbox.Text.ToUpper();

        // Valida el tipo de usuario (Admin: LXXX; Alumno: AXXX)
        if (LoginText[0].Equals('A') && LoginText.Length == 9)
        {
            UserType = "Alumnos";
            UserID = "Matricula";
        }
        else if (LoginText[0].Equals('L') && LoginText.Length == 9)
        {
            UserType = "Administradores";
            UserID = "Nomina";
        }
        // Si no se cumple ninguna de las dos condiciones, se regresa con error
        else
        {
            LoginErrorRedirectAdmin();
            return;
        }

        DatabaseConnection dbCon = new DatabaseConnection();

        // Se verifíca el usuario en la Base de Datos
        if (dbCon.UserExists(LoginText, UserType))
        {
            String storedId;
            String storedName;
            String storedSalt;
            String storedHash;

            SecurityTools secTools = new SecurityTools();

            SqlCommand ParameterizedQuery = new SqlCommand("SELECT * FROM " + UserType + " WHERE " + UserID + " = @Login");
            ParameterizedQuery.Parameters.Add(new SqlParameter("@Login", LoginText));

            if (String.Equals(UserType, "Alumnos"))
            {
                using (SqlDataReader loginReader = dbCon.ParameterizedExecuteSelect(ParameterizedQuery))
                {
                    if (loginReader.Read() && String.Equals(LoginText, (String) loginReader[UserID]))
                    {
                        storedSalt = (String) loginReader["Salt"];
                        storedHash = (String) loginReader["Contrasena"];

                        // Si su password no coincide, se redirecciona con error
                        if (!secTools.CompareHashPass(storedHash, storedSalt, ContrasenaLoginTextbox.Text))
                        {
                            loginReader.Close();
                            dbCon.CloseConnection();
                            LoginErrorRedirect();
                        }

                        storedId = (String) loginReader[UserID];
                        storedName = (String) loginReader["Nombre"];

                        loginReader.Close();

                        // si no esta actiava su cuenta, se redirecciona con error
                        if (!dbCon.UserValidationCheck(storedId))
                        {
                            dbCon.CloseConnection();
                            Session["LoginStatus"] =
                                "<div class='alert alert-error' align='center'><strong>Tu cuenta no ha sido activada, revisa " +
                                "tu correo para poder activarla. <br/>Nota: No olvides revisar tu carpeta de correo no deseado (spam) en caso de que no " +
                                "lo veas en tu bandeja de entrada.</strong></div>";
                            Response.Redirect("~/Default.aspx");
                        }

                        dbCon.CloseConnection();
                        Session["SessionName"] = storedName;
                        Session["SessionID"] = storedId;
                        Session["UserType"] = UserType;
                        Response.Redirect("~/Alumno/");
                    }
                }
            } 
            else if (String.Equals(UserType, "Administradores"))
            {
                using (SqlDataReader loginReader = dbCon.ParameterizedExecuteSelect(ParameterizedQuery))
                {
                    if (loginReader.Read() && String.Equals(LoginText, (String) loginReader[UserID]))
                    {
                        storedSalt = (String)loginReader["Salt"];
                        storedHash = (String)loginReader["Contrasena"];

                        // Si su password no coincide, se redirecciona con error
                        if (!secTools.CompareHashPass(storedHash, storedSalt, ContrasenaLoginTextbox.Text))
                        {
                            loginReader.Close();
                            dbCon.CloseConnection();
                            LoginErrorRedirectAdmin();
                        }

                        if ((Boolean)loginReader["Habilitada"] == false)
                        {
                            Session["LoginStatus"] =
                                "<div class='alert alert-error' align='center'><strong>Esta cuenta ha sido deshabilitada.</strong></div>";
                            Response.Redirect("~/Default.aspx");
                        }

                        storedId = (String)loginReader[UserID];
                        storedName = (String)loginReader["Nombre"];

                        if ((Boolean)loginReader["SuperAdmin"] == true)
                            Session["SuperAdminActive"] = "Active";

                        loginReader.Close();
                        dbCon.CloseConnection();
                        Session["SessionName"] = storedName;
                        Session["SessionID"] = storedId;
                        Session["UserType"] = UserType;
                        Response.Redirect("~/AdminCP/");
                    }
                }
            }
            LoginErrorRedirectAdmin();
            dbCon.CloseConnection();
        }
        LoginErrorRedirectAdmin();
        dbCon.CloseConnection();
    }


    // Redirecciona cuando existe error de login o password
    public void LoginErrorRedirect()
    {
        Session["LoginStatus"] = "<div class='alert alert-error' align='center'><strong>Nombre de usuario y " +
            "contrase&ntilde;a inv&aacute;lidos, intenta de nuevo.<br />Si no recuerdas tu contrase&ntilde;a " +
            "<a style='none' href='Services/RecuperarPassword.aspx'><span style='color: #3a87ad'>recup&eacute;rala " +
            "en esta liga.</span></a></strong></div>";
        Response.Redirect("~/Default.aspx");
    }


    // Redirecciona cuando existe error de login o password cuando es un Admin
    public void LoginErrorRedirectAdmin()
    {
        Session["LoginStatus"] =
            "<div class='alert alert-error' align='center'><strong>Nombre de usuario " +
            "y contrase&ntilde;a inv&aacute;lidos, intenta de nuevo.</strong></div>";
        Response.Redirect("~/Default.aspx");
    }


    // Terminar la sesión
    protected void LogoutButton_Click(object sender, EventArgs e)
    {
        Session.Clear();
        Session.Abandon();
        Session.RemoveAll();
        Response.Redirect("~/Default.aspx");
    }
}
